<?php

/**
 * Школьный класс
 */
class school_class {
	
	/**
	 * Название класса
	 * @var string
	 */
	private $name = NULL;
	
	/**
	 * Специализация класса
	 * Физ-мат или хим-био
	 * @var string ('pm'|'cb')
	 */
	private $specialization = NULL;
	
	/**
	 * Поток класса
	 * @var char ('a'|'b'|'c')
	 */
	private $stream = NULL;
	
	/**
	 * Ученики в классе
	 * @var array of pupil
	 */
	private $pupils = NULL;
	
	/**
	 * Справка о том, к какому потоку и специализации относится класс
	 * @var classes
	 */
	private $classes = NULL;
	
	/**
	 * Требование сортировать по фамилии
	 * @var bool
	 */
	private $sort = false;
	
	function __construct($name, $sort = false) {
		$this->init_classes();
		$this->set_name($name);
		$this->set_sort($sort);
		$this->init_specialization();
		$this->init_stream();
		$this->init_pupils();
	}
	
	function __destruct() {
		
	}
	
	private function init_classes() {
		include_once(__DIR__ . '/class.classes.php');
		$this->classes = new classes('all');
	}
	
	function set_name($name) {
		$this->classes->set_code('all');
		// проверка, что такой класс есть
		if (array_search($name, $this->classes->get_classes()) !== false) {
			$this->name = $name;
		} else {
			throw new Exception("'$name' is invalid school class name");
		}
	}
	
	function set_sort($sort) {
		$this->sort = $sort;
	}
	
	/**
	 * Инициализация специализации класса
	 */
	function init_specialization() {
		if (isset($this->name)) {
			$this->specialization = $this->classes->get_specialization($this->name);
		} else {
			throw new Exception("Not exist property name in school_class");
		}
	}
	
	function init_stream() {
		if (isset($this->name)) {
			$this->stream = $this->classes->get_stream($this->name);
		} else {
			throw new Exception("Not exist property name in school_class");
		}
	}
	
	function get_name() {
		return $this->name;
	}
	
	function get_specialization() {
		return $this->specialization;
	}
	
	function get_stream() {
		return $this->stream;
	}
	
	/**
	 * Берёт идентификаторы пользователей в классе
	 */
	private function get_pupils_identificators() {
		global $DB;
		
		$sql = file_get_contents(__DIR__ . '/sql/get_pupils_id_in_class.sql');
		$stmt = $DB->prepare($sql);
		$stmt->bind_param('s', $this->name);
		$stmt->execute();
		
		return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
	}
	
	/**
	 * Сравнивает учеников по фамилии
	 * @param object $pupil_1
	 * @param object $pupil_2
	 * @return -1 | 0 | 1
	 */
	private function lastname_comparator($pupil_1, $pupil_2) {
		return strcmp($pupil_1->get_lastname(), $pupil_2->get_lastname());
	}
	
	/**
	 * Взять учеников, состоящих в заданном классе
	 * @return array()
	 */
	private function init_pupils() {
		$identificators = $this->get_pupils_identificators();
		
		include_once(__DIR__ . '/class.pupil.php');
		$pupils = array();
		for ($i = 0; $i < count($identificators); $i++) {
			$pupils[] = new pupil($identificators[$i]['id']);
		}
		if ($this->sort === true) {
			uasort($pupils, array("school_class", "lastname_comparator"));
		}
		$this->pupils = $pupils;
	}
	
	function get_iterator() {
		return new ArrayIterator($this->pupils);
	}
}

?>
